<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // - 所有的实例对象都有`__proto__`属性, 它指向的就是原型对象
    // {
    //     const obj = {};// new Object
    //     console.log(obj.__proto__ === Object.prototype);// true
    //
    //     function fn() {
    //
    //     }
    //     console.log(fn.__proto__ === Function.prototype);// true
    //
    //     function Box(){
    //
    //     }
    //     const obj2 = new Box();
    //     console.log(obj2.__proto__ === Box.prototype);// true
    // }


    // - 这样通过`__proto__`属性就形成了一个链的结构---->原型链
    {
        // const obj = {a: 1};
        // Object.prototype.a = 2;
        // console.log(obj.__proto__ === Object.prototype);// true
        // console.log(Object.prototype.__proto__);// null
        // console.log(obj.__proto__.__proto__);// null
        // console.log(obj.a);


        // function fn() {
        //
        // }
        // // fn.a = 3;
        // // Function.prototype.a = 1;
        // // Object.prototype.a = 2;
        // console.log(fn.__proto__ === Function.prototype);// true
        // console.log(Function.prototype.__proto__ === Object.prototype);// true
        // console.log(Object.prototype.__proto__);// null
        // console.log(fn.__proto__.__proto__.__proto__);// null
        // console.log(fn.a);

        // function Box(){
        //     this.a = 1;
        // }
        // Box.prototype.a = 2;
        // Object.prototype.a = 3;
        // const obj = new Box();
        // console.log(obj.__proto__ === Box.prototype);// true
        // console.log(Box.prototype.__proto__ === Object.prototype);// true
        // console.log(Object.prototype.__proto__);// null
        // console.log(obj.__proto__.__proto__.__proto__);// null
        // console.log(obj.a);


    }

    // - 当查找对象内部的属性/方法时,` js`引擎自动沿着这个原型链查找

    // - 当给对象属性赋值时不会使用原型链, 而只是在当前对象中进行操作
    {
        function Box(){
        }
        Box.prototype.a = 2;
        const obj = new Box();
        obj.a = 100;// 为当前对象实例增加属性a,值为100
        console.log(obj.a);// 100
        console.log(obj.__proto__.a);// 2
    }
</script>
</html>